package cn.lg.soar.activiti.api.service;

import cn.lg.soar.activiti.api.model.*;
import com.google.common.collect.Lists;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 流程接口
 * @author luguoxiang
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface IActivitiApi {
    /**
     * 启动流程
     * @param dto
     * @return
     */
    ProcessInstanceDTO startProcess(StartProcessDTO dto);

    /**
     * 完成任务
     * @param dto
     */
    void completeTask(CompleteTaskDTO dto);

    /**
     * 查询任务列表
     * @param processKey 流程key
     * @param businessIds 业务id
     * @param candidates 候选人，用户：username，角色：R:roleCode，组织机构：O:orgId
     * @return
     */
    List<TaskDTO> tasks(String processKey, Collection<String> businessIds, Collection<String> candidates);

    /**
     * 获取任务
     * @param processKey 流程key
     * @param businessIds 业务id
     * @param candidates 候选人，用户：username，角色：R:roleCode，组织机构：O:orgId
     * @return
     */
    default Map<String, List<TaskDTO>> tasksMap(String processKey, Collection<String> businessIds, Collection<String> candidates) {
        List<TaskDTO> tasks = tasks(processKey, businessIds, candidates);
        return tasks.stream().collect(Collectors.groupingBy(TaskDTO::getBusinessId));
    }

    /**
     * 获取任务
     * @param processKey 流程key
     * @param businessId 业务id
     * @param candidates 候选人，用户：username，角色：R:roleCode，组织机构：O:orgId
     * @return
     */
    default List<TaskDTO> tasks(String processKey, String businessId, Collection<String> candidates) {
        return tasks(processKey, Lists.newArrayList(businessId), candidates);
    }

    /**
     * 获取任务（适用于当前用户查询自己的任务）
     * @param processKey 流程key
     * @param businessId 业务id
     * @param candidates 候选人，用户：username，角色：R:roleCode，组织机构：O:orgId
     * @return
     */
    default TaskDTO task(String processKey, String businessId, Collection<String> candidates) {
        List<TaskDTO> tasks = tasks(processKey, Lists.newArrayList(businessId), candidates);
        if (tasks.isEmpty()) {
            return null;
        }
        return tasks.get(0);
    }

    /**
     * 历史任务（审批日志）
     * @param processKey 流程key
     * @param businessId 业务id
     * @return
     */
    List<HistoryTaskDTO> historyTasks(String processKey, String businessId);
}
